home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / RCSC.ZIP / LIB51 / RUNTIME.C < prev    next >
Text File  |  1997-01-12  |  10KB  |  736 lines

  1. /*
  2. ** Concurrent Small C 8051 runtime library
  3. ** Copyright 1997 Andy W. K. Yuen
  4. ** All rights reserved.
  5. **
  6. ** This library contains all mandatory routines including
  7. ** conditional branching, multiplication, division, etc.
  8. ** for the 8051.
  9. */
  10. #asm
  11.  
  12. SEG CODE
  13.  
  14. public __addsp:
  15.     MOV    A,DPL
  16.     ADD    A,VSPL
  17.     MOV    VSPL,A
  18.     MOV    A,DPH
  19.     ADDC    A,VSPH
  20.     MOV    VSPH,A
  21.     RET
  22.  
  23. public __enter:
  24.     ;;save return address onto external stack
  25.     ;;low bye followed by high byte (different
  26.     ;;from 8051 stack order
  27.     MOV    DPL,VSPL
  28.     MOV    DPH,VSPH
  29.     INC    DPTR
  30.     MOVX    @DPTR,A
  31.     INC    DPTR
  32.     MOV    A,B
  33.     MOVX    @DPTR,A
  34.     ;;save virtual BP pointer onto external stack
  35.     INC    DPTR
  36.     MOV    A,VBPH
  37.     MOVX    @DPTR,A
  38.     INC    DPTR
  39.     MOV    A,VBPL
  40.     MOVX    @DPTR,A
  41.     ;;save stack and BP pointers
  42.     MOV    VBPL,VSPL
  43.     MOV    VBPH,VSPH
  44.     MOV    VSPL,DPL
  45.     MOV    VSPH,DPH
  46.     RET
  47.  
  48. public __return:
  49.     ;;restore SP
  50.     MOV    A,DPL
  51.     ADD    A,VSPL
  52.     MOV    VSPL,A
  53.     MOV    A,DPH
  54.     ADDC    A,VSPH
  55.     MOV    VSPH,A
  56.     MOV    DPL,VBPL
  57.     MOV    DPH,VBPH
  58.     ;;push return address onto internal stack
  59.     INC    DPTR
  60.     MOVX    A,@DPTR
  61.     PUSH    ACC
  62.     INC    DPTR
  63.     MOVX    A,@DPTR
  64.     PUSH    ACC
  65.     ;;restore old BP
  66.     INC    DPTR
  67.     MOVX    A,@DPTR
  68.     MOV    VBPH,A
  69.     INC    DPTR
  70.     MOVX    A,@DPTR
  71.     MOV    VBPL,A
  72.     RET
  73.  
  74. public __call1:        
  75.     MOV    A,V1L
  76.     PUSH    ACC
  77.     MOV    A,V1H
  78.     PUSH    ACC
  79. __call1ret:
  80.     RET
  81.  
  82. public __switch:
  83.     ;;get switch table address
  84.     POP    ACC
  85.     MOV    DPH,A
  86.     POP    ACC
  87.     MOV    DPL,A
  88.     ;;check for end of table
  89. checkend:
  90.     CLR    A
  91.     MOVC    A,@A+DPTR
  92.     JNZ    chkval
  93.     MOV    A,#1
  94.     MOVC    A,@A+DPTR
  95.     JZ    done
  96. chkval:
  97.     ;;check case value
  98.     CLR    C
  99.     MOV    A,#3
  100.     MOVC    A,@A+DPTR
  101.     SUBB    A,V1L
  102.     JNZ    next
  103.     MOV    A,#2
  104.     MOVC    A,@A+DPTR
  105.     SUBB    A,V1H
  106.     JNZ    next
  107.     MOV    A,#1
  108.     MOVC    A,@A+DPTR
  109.     PUSH    ACC
  110.     CLR    A
  111.     MOVC    A,@A+DPTR
  112.     PUSH    ACC
  113.     RET
  114. next:
  115.     INC    DPTR
  116.     INC    DPTR
  117.     INC    DPTR
  118.     INC    DPTR
  119.     SJMP    checkend
  120. done:
  121.     ;;jump to default or continuation
  122.     MOV    A,#2
  123.     JMP    @A+DPTR
  124.  
  125. ;;data access operations
  126. public __getb1p:
  127.     MOV    A,DPL
  128.     ADD    A,V2L
  129.     MOV    DPL,A
  130.     MOV    A,DPH
  131.     ADDC    A,V2H
  132.     MOV    DPH,A
  133.     MOVX    A,@DPTR
  134.     MOV    V1L,A
  135.     ;;sign extend register
  136.     MOV    V1H,#0
  137.     JNB    ACC.7,$+5
  138.     MOV    V1H,#-1
  139.     RET
  140.  
  141. public __getb1s:
  142.     MOV    A,DPL
  143.     ADD    A,VBPL
  144.     MOV    DPL,A
  145.     MOV    A,DPH
  146.     ADDC    A,VBPH
  147.     MOV    DPH,A
  148.     MOVX    A,@DPTR
  149.     MOV    V1L,A
  150.     ;;sign extend register
  151.     MOV    V1H,#0
  152.     JNB    ACC.7,$+5
  153.     MOV    V1H,#-1
  154.     RET
  155.  
  156. public __getb1su:    
  157.     MOV    A,DPL
  158.     ADD    A,VBPL
  159.     MOV    DPL,A
  160.     MOV    A,DPH
  161.     ADDC    A,VBPH
  162.     MOV    DPH,A
  163.     MOVX    A,@DPTR
  164.     MOV    V1L,A
  165.     RET
  166.  
  167. public __getw1p:
  168.     MOV    A,DPL
  169.     ADD    A,V2L
  170.     MOV    DPL,A
  171.     MOV    A,DPH
  172.     ADDC    A,V2H
  173.     MOV    DPH,A
  174.     MOVX    A,@DPTR
  175.     MOV    V1H,A
  176.     INC    DPTR
  177.     MOVX    A,@DPTR
  178.     MOV    V1L,A
  179.     RET
  180.  
  181. public __getw1s:
  182.     MOV    A,DPL
  183.     ADD    A,VBPL
  184.     MOV    DPL,A
  185.     MOV    A,DPH
  186.     ADDC    A,VBPH
  187.     MOV    DPH,A
  188.     MOVX    A,@DPTR
  189.     MOV    V1H,A
  190.     INC    DPTR
  191.     MOVX    A,@DPTR
  192.     MOV    V1L,A
  193.     RET
  194.  
  195. public __getw2p:    
  196.     MOV    A,DPL
  197.     ADD    A,V2L
  198.     MOV    DPL,A
  199.     MOV    A,DPH
  200.     ADDC    A,V2H
  201.     MOV    DPH,A
  202.     MOVX    A,@DPTR
  203.     MOV    V2H,A
  204.     INC    DPTR
  205.     MOVX    A,@DPTR
  206.     MOV    V2L,A
  207.     RET
  208.  
  209. public __getw2s:
  210.     MOV    A,DPL
  211.     ADD    A,VBPL
  212.     MOV    DPL,A
  213.     MOV    A,DPH
  214.     ADDC    A,VBPH
  215.     MOV    DPH,A
  216.     MOVX    A,@DPTR
  217.     MOV    V2H,A
  218.     INC    DPTR
  219.     MOVX    A,@DPTR
  220.     MOV    V2L,A
  221.     RET
  222.  
  223. public __point1s:
  224.     MOV    A,DPL
  225.     ADD    A,VBPL
  226.     MOV    V1L,A
  227.     MOV    A,DPH
  228.     ADDC    A,VBPH
  229.     MOV    V1H,A
  230.     RET
  231.  
  232. public __point2s:
  233.     MOV    A,DPL
  234.     ADD    A,VBPL
  235.     MOV    V2L,A
  236.     MOV    A,DPH
  237.     ADDC    A,VBPH
  238.     MOV    V2H,A
  239.     RET
  240.  
  241. ;;logical negate
  242. public __lneg1:        
  243.     MOV    A,V1L
  244.     ORL    A,V1H
  245.     JNZ    __setfalse
  246. __settrue:
  247.     MOV    V1L,#1
  248.     MOV    V1H,#0
  249.     RET
  250. __setfalse:
  251.     MOV    V1L,#0
  252.     MOV    V1H,#0
  253.     RET
  254.  
  255. ;;comparison operators
  256.  
  257. public __eq12:    
  258.     CLR    C
  259.     MOV    A,V1L
  260.     SUBB    A,V2L
  261.     JZ    $+5
  262.     LJMP    __setfalse
  263.     MOV    A,V1H
  264.     SUBB    A,V2H
  265.     JZ    $+5
  266.     LJMP    __setfalse
  267.     MOV    V1L,#1
  268.     MOV    V1H,#0
  269.     RET
  270.  
  271. public __ne12:        
  272.     LCALL    __eq12
  273.     MOV    A,V1L
  274.     XRL    A,#1
  275.     MOV    V1L,A
  276.     RET
  277.  
  278. public __lt12:        
  279.     MOV    A,V1H
  280.     XRL    A,V2H
  281.     JB    ACC.7,$+6
  282.     LJMP    __ult12
  283.     MOV    A,V2H
  284.     JNB    ACC.7,$+6
  285.     LJMP    __settrue
  286.     LJMP    __setfalse
  287.  
  288. public __ge12:        
  289.     LCALL    __lt12
  290.     MOV    A,V1L
  291.     XRL    A,#1
  292.     MOV    V1L,A
  293.     RET
  294.  
  295. public __le12:        
  296.     MOV    A,V1H
  297.     XRL    A,V2H
  298.     JB    ACC.7,$+6
  299.     LJMP    __ule12
  300.     MOV    A,V2H
  301.     JNB    ACC.7,$+6
  302.     LJMP    __settrue
  303.     LJMP    __setfalse
  304.  
  305. public __gt12:        
  306.     LCALL    __le12
  307.     MOV    A,V1L
  308.     XRL    A,#1
  309.     MOV    V1L,A
  310.     RET
  311.  
  312. public __ult12:        
  313.     CLR    C
  314.     MOV    A,V2L
  315.     SUBB    A,V1L
  316.     MOV    A,V2H
  317.     SUBB    A,V1H
  318.     JC    $+5
  319.     LJMP    __setfalse
  320.     MOV    V1L,#1
  321.     MOV    V1H,#0
  322.     RET
  323.  
  324. public __uge12:        
  325.     LCALL    __ult12
  326.     MOV    A,V1L
  327.     XRL    A,#1
  328.     MOV    V1L,A
  329.     RET
  330.  
  331. public __ugt12:        
  332.     LCALL    __ule12
  333.     MOV    A,V1L
  334.     XRL    A,#1
  335.     MOV    V1L,A
  336.     RET
  337.  
  338. public __ule12:        
  339.     CLR    C
  340.     MOV    A,V2L
  341.     SUBB    A,V1L
  342.     MOV    A,V2H
  343.     SUBB    A,V1H
  344.     JC    $+5
  345.     LJMP    __eq12
  346.     MOV    V1L,#1
  347.     MOV    V1H,#0
  348.     RET
  349.  
  350. ;;arithmetic operations
  351. public __asl12:        
  352.     MOV    A,V1L
  353.     MOV    VLCNT,A
  354.     MOV    A,V2L
  355.     MOV    V1L,A
  356.     MOV    A,V2H
  357.     MOV    V1H,A
  358. aslloop:
  359.     CLR    C
  360.     MOV    A,V1L
  361.     RLC    A
  362.     MOV    V1L,A
  363.     MOV    A,V1H
  364.     RLC    A
  365.     MOV    V1H,A
  366.     DJNZ    VLCNT,aslloop
  367.     RET
  368.  
  369. public __asr12:        
  370.     MOV    A,V1L
  371.     MOV    VLCNT,A
  372.     MOV    A,V2L
  373.     MOV    V1L,A
  374.     MOV    A,V2H
  375.     MOV    V1H,A
  376. asrloop:
  377.     CLR    C
  378.     MOV    A,V1L
  379.     RRC    A
  380.     MOV    V1L,A
  381.     MOV    A,V1H
  382.     RRC    A
  383.     MOV    V1H,A
  384.     DJNZ    VLCNT,asrloop
  385.     RET
  386.  
  387. public __udiv12:    
  388.     LCALL    __div16
  389.     MOV    V1L,VR2
  390.     MOV    V1H,VR3
  391.     RET
  392.  
  393. public __umul12:    
  394.     LCALL    __mul16
  395.     MOV    V1L,VR0
  396.     MOV    V1H,VR1
  397.     RET
  398.  
  399. public __umod12:    
  400.     LCALL    __div16
  401.     MOV    V1L,VR0
  402.     MOV    V1H,VR1
  403.     RET
  404.  
  405. public __mul12:        
  406.     ;;save V2
  407.     MOV    A,V2H
  408.     PUSH    ACC
  409.     MOV    A,V2L
  410.     PUSH    ACC
  411.     ;;convert to sign/magnitude format and multiply
  412.     LCALL    __cv122sm
  413.     LCALL    __umul12
  414.     ;;convert back to 2's complement format
  415.     JB    V1SIGN,mul_tst2
  416.     JB    V2SIGN,mul_docv
  417.     ;;both V1 and V2 positive
  418. mul_docpy:
  419.     MOV    A,VR0
  420.     MOV    B,VR1
  421.     SJMP    mul_save1
  422. mul_tst2:
  423.     JB    V2SIGN,mul_docpy
  424. mul_docv:
  425.     ;;convert back to 2's complement format
  426.     SETB    VRSIGN
  427.     LCALL    __cvsm2tc
  428. mul_save1:
  429.     MOV    V1L,A
  430.     MOV    V1H,B
  431.     POP    ACC
  432.     MOV    V2L,A
  433.     POP    ACC
  434.     MOV    V2H,A
  435.     RET
  436.  
  437. public __div12:        
  438.     ;;save V2
  439.     MOV    A,V2H
  440.     PUSH    ACC
  441.     MOV    A,V2L
  442.     PUSH    ACC
  443.     ;;convert to sign/magnitude format and multiply
  444.     LCALL    __cv122sm
  445.     LCALL    __udiv12
  446.     ;;move quotient to expected place for conversion
  447.     MOV    A,VR2
  448.     MOV    VR0,A
  449.     MOV    A,VR3
  450.     MOV    VR1,A
  451.     ;;convert back to 2's complement format
  452.     JB    V1SIGN,div_tst2
  453.     JB    V2SIGN,div_docv
  454.     ;;both V1 and V2 positive
  455. div_docpy:
  456.     MOV    A,VR0
  457.     MOV    B,VR1
  458.     SJMP    div_save1
  459. div_tst2:
  460.     JB    V2SIGN,div_docpy
  461. div_docv:
  462.     ;;convert back to 2's complement format
  463.     SETB    VRSIGN
  464.     LCALL    __cvsm2tc
  465. div_save1:
  466.     MOV    V1L,A
  467.     MOV    V1H,B
  468.     POP    ACC
  469.     MOV    V2L,A
  470.     POP    ACC
  471.     MOV    V2H,A
  472.     RET
  473.  
  474. public __mod12:        
  475.     ;;save V2
  476.     MOV    A,V2H
  477.     PUSH    ACC
  478.     MOV    A,V2L
  479.     PUSH    ACC
  480.     ;;convert to sign/magnitude format and multiply
  481.     LCALL    __cv122sm
  482.     LCALL    __udiv12
  483.     ;;convert back to 2's complement format
  484.     JB    V1SIGN,mod_tst2
  485.     JB    V2SIGN,mod_docv
  486.     ;;both V1 and V2 positive
  487. mod_docpy:
  488.     MOV    A,VR0
  489.     MOV    B,VR1
  490.     SJMP    mod_save1
  491. mod_tst2:
  492.     JB    V2SIGN,mod_docpy
  493. mod_docv:
  494.     ;;convert back to 2's complement format
  495.     SETB    VRSIGN
  496.     LCALL    __cvsm2tc
  497. mod_save1:
  498.     MOV    V1L,A
  499.     MOV    V1H,B
  500.     POP    ACC
  501.     MOV    V2L,A
  502.     POP    ACC
  503.     MOV    V2H,A
  504.     RET
  505.  
  506. ;;stack operations
  507. public __pushm:        
  508.     MOVX    A,@DPTR
  509.     MOV    B,A
  510.     INC    DPTR
  511.     MOVX    A,@DPTR
  512.     XCH    A,B
  513.     LJMP    __pushab
  514.  
  515. public __pushp:        
  516.     MOV    DPL,V2L
  517.     MOV    DPH,V2H
  518.     LJMP    __pushm
  519.  
  520. public __pushs:        
  521.     MOV    A,DPL
  522.     ADD    A,VBPL
  523.     MOV    DPL,A
  524.     MOV    A,DPH
  525.     ADDC    A,VBPH
  526.     MOV    DPH,A
  527.     LJMP    __pushm
  528.  
  529. public __push1:
  530.     MOV    A,V1H
  531.     MOV    B,V1L
  532.     LJMP    __pushab
  533.  
  534. public __push2:
  535.     MOV    A,V2H
  536.     MOV    B,V2L
  537.     LJMP    __pushab
  538.  
  539. public __pop2:
  540.     CLR    C
  541.     MOV    A,VSPL
  542.     SUBB    A,#2
  543.     MOV    VSPL,A
  544.     MOV    A,VSPH
  545.     SUBB    A,#0
  546.     MOV    VSPH,A
  547.     MOV    DPL,VSPL
  548.     MOV    DPH,VSPH
  549.     INC    DPTR
  550.     MOVX    A,@DPTR
  551.     MOV    V2H,A
  552.     INC    DPTR
  553.     MOVX    A,@DPTR
  554.     MOV    V2L,A
  555.     RET
  556.  
  557. ;;misc functions
  558. public _ccargc:
  559.     MOV    A,VACNT
  560.     MOV    V1L,A
  561.     MOV    V1H,#0
  562.     RET
  563.  
  564. ;;local support routines
  565. __pushab:
  566.     MOV    DPL,VSPL
  567.     MOV    DPH,VSPH
  568.     INC    DPTR
  569.     MOVX    @DPTR,A
  570.     INC    DPTR
  571.     MOV    A,B
  572.     MOVX    @DPTR,A
  573.     MOV    VSPL,DPL
  574.     MOV    VSPH,DPH
  575.     RET
  576.  
  577. __mul16:    ;;VR <- V1 * V2
  578.     ;;note: V1 contents destroyed during calculation
  579.     ;;muliticand in V1, multiplier in V2
  580.     ;;results saved in VR
  581.  
  582.     ;;multiply 16-bit V1 by 8-bit V2L
  583.     MOV    A,V2L
  584.     MOV    B,V1L
  585.     MUL    AB
  586.     MOV    VR0,A
  587.     MOV    R0,B
  588.     MOV    A,V2L
  589.     MOV    B,V1H
  590.     MUL    AB
  591.     ADD    A,R0
  592.     MOV    VR1,A
  593.     CLR    A
  594.     ADDC    A,B
  595.     MOV    VR2,A
  596.  
  597.     ;;multiply 16-bit V1 by 8-bit V2H
  598.     MOV    A,V2H
  599.     MOV    B,V1L
  600.     MUL    AB
  601.     MOV    V1L,A
  602.     MOV    R0,B
  603.     MOV    A,V2H
  604.     MOV    B,V1H
  605.     MUL    AB
  606.     ADD    A,R0
  607.     MOV    V1H,A
  608.     CLR    A
  609.     ADDC    A,B
  610.     MOV    R0,A
  611.  
  612.     ;;add the partial sums
  613.     MOV    A,VR1
  614.     ADD    A,V1L
  615.     MOV    VR1,A
  616.     MOV    A,VR2
  617.     ADDC    A,V1H
  618.     MOV    VR2,A
  619.     CLR    A
  620.     ADDC    A,R0
  621.     MOV    VR3,A
  622.     RET
  623.  
  624. __div16:    ;;VR <- V1 / V2
  625.     ;;note: V1 contents destroyed during calculation
  626.     ;;dividend in V1, divisor in V2
  627.     ;;quotient saved in VR2/3, remainder saved in VR0/1
  628.     MOV    VR0,#0
  629.     MOV    VR1,#0
  630.     MOV    VR2,#0
  631.     MOV    VR3,#0
  632.     MOV    VLCNT,#16
  633. divloop:
  634.     ;;shift dividend
  635.     CLR    C
  636.     MOV    A,V1L
  637.     RLC    A
  638.     MOV    V1L,A
  639.     MOV    A,V1H
  640.     RLC    A
  641.     MOV    V1H,A
  642.     ;;shift partial remainder
  643.     MOV    A,VR0
  644.     RLC    A
  645.     MOV    VR0,A
  646.     MOV    A,VR1
  647.     RLC    A
  648.     MOV    VR1,A
  649.     ;;perform subtration to see if partial remainder > divisor
  650.     CLR    C
  651.     MOV    A,VR0
  652.     SUBB    A,V2L
  653.     MOV    R0,A
  654.     MOV    A,VR1
  655.     SUBB    A,V2H
  656.     MOV    R1,A
  657.     CPL    C
  658.     JNC    addbit
  659.     ;;update partial remainder
  660.     MOV    VR0,R0
  661.     MOV    VR1,R1
  662. addbit:
  663.     ;;update partial quotient
  664.     MOV    A,VR2
  665.     RLC    A
  666.     MOV    VR2,A
  667.     MOV    A,VR3
  668.     RLC    A
  669.     MOV    VR3,A
  670.     DJNZ    VLCNT,divloop
  671.     RET
  672.  
  673. __cvtc2sm:    ;;convert 2's complement to sign/magnitude format
  674.     ;;A, B contains low and high byte of 2's complement
  675.     ;;VR0,VR1 contains magnitude and VRSIGN sign on return
  676.     JB    ACC.7,cv2sm
  677.     CLR    VRSIGN
  678.     MOV    VR0,A
  679.     MOV    VR1,B
  680.     RET
  681. cv2sm:
  682.     SETB    VRSIGN
  683.     CPL    A
  684.     ADD    A,#1
  685.     MOV    VR0,A
  686.     MOV    A,B
  687.     CPL    A
  688.     ADDC    A,#0
  689.     MOV    VR1,A
  690.     RET
  691.  
  692. __cvsm2tc:    ;;convert sign/magnitude to 2's complement format
  693.     ;;VR0,VR1 contains magnitude and VRSIGN sign
  694.     ;;A, B contains low and high byte of 2's complement on return
  695.     JB    VRSIGN,cv2tc
  696.     MOV    A,VR0
  697.     MOV    B,VR1
  698.     RET
  699. cv2tc:
  700.     MOV    A,VR0
  701.     CPL    A
  702.     ADD    A,#1
  703.     MOV    B,A
  704.     MOV    A,VR1
  705.     CPL    A
  706.     ADDC    A,#0
  707.     XCH    A,B
  708.     RET
  709.  
  710. __cv122sm:
  711.     ;;convert V1 to sign/magnitude format
  712.     MOV    A,V1L
  713.     MOV    B,V1H
  714.     LCALL    __cvtc2sm
  715.     CLR    V1SIGN
  716.     JNB    VRSIGN,dov2
  717.     SETB    V1SIGN
  718.     MOV    V1L,VR0
  719.     MOV    V1H,VR1
  720. dov2:
  721.     ;;convert V2 to sign/magnitude format
  722.     MOV    A,V2L
  723.     MOV    B,V2H
  724.     LCALL    __cvtc2sm
  725.     CLR    V2SIGN
  726.     JNB    VRSIGN,return
  727.     SETB    V2SIGN
  728.     MOV    V2L,VR0
  729.     MOV    V2H,VR1
  730. return:
  731.     RET
  732.  
  733.  
  734. #endasm
  735.  
  736.